/**********************************************************************/
/* Programa: COMPRESOR 
Este programa es el encargado del manejo de TDA - lista del compresor
Integrantes        : Catalina Windmuller, Ayelén Tamiozzo y Francisco Soler               
Fecha              : 17 de abril de 2011                                 
Versión            : 01                                                     
Nombre del archivo : lista.h */

/**********************************************************************/


#ifndef _LISTAS_H
	#define _LISTAS_H 1
	//En estructuras.h estan almacenadas todas las estructuras, ej tdato

	typedef void* tdatol;  //va a ser del 1er hash la estructura hash_dato y del segundo hash_ciudad

	struct tnodol{
		tdatol dato;
		struct tnodol* siguiente;
	};
	
	typedef struct tnodol *tlista;
	typedef struct {
		struct tnodol *anterior;
		struct tnodol *actual;
	} tlista_iter;

	typedef bool (*destruir_dato_lista)(tdatol dato);
	/**************************Crear_Lista*****************************/
	//Primitiva de TDA: Creación de la lista 
	//Post: se crea una lista vacía, devuelve falso en caso de error
    bool crear_lista (tlista *lista);
    
    /***********************Crear_Lista_Iter***************************/
	//Primitiva de TDA: Creación del iterador de la lista
	//Pre: la lista fue creada 
	//Post: Se crea un iterador que apunta a la primera posición de la lista
    bool crear_lista_iter(tlista *lista, tlista_iter *iter);
    
    /**************************Lista_Vacía*****************************/
	//Primitiva de TDA: Verificación de estado de la lista (¿vacía?)
	//Pre: la lista fue creada
	//Post: devuelve true en caso de estar vacío, false en caso contrario
    bool lista_vacia (tlista lista);
    
	/*************************Destruir_Lista***************************/
	//Primitiva de TDA: Liberar memoria utilizada por la lista
	//Pre: la cola existe
	//Post: se eliminan todos los nodos de la lsita y la lista en sí 
    bool destruir_lista (tlista *lista, destruir_dato_lista destruir);
    
    /***********************Lista_Iter_Final***************************/
	//Primitiva de TDA: Verificación de estado del iterador (¿final?)
	//Pre: la lista y el iterador fue creada
	//Post: devuelve true en caso de señal el final  
    bool lista_iter_final (tlista_iter *iter);
    
    /**********************Avanzar_Lista_Iter**************************/
	//Primitiva de TDA: Mueve el iterador una posición
	//Pre: la lista y el iterador fue creada y este último no señala
	//al final
	//Post: mueve el puntero del iterador para que señale al siguiente nodo  
    bool avanzar_lista_iter (tlista_iter* iter);
    
    /*************************Ver_Lista_Actual*************************/
	//Primitiva de TDA: Ver el elemento del nodo que esta señalando el 
	//iterador
	//Pre: la lista y el iterador fueron creados, y no se esta señalando
	//el final
	//Post: devuelve en elemento el dato almacenado en ese nodo 
    bool ver_lista_actual ( tlista_iter* iter, tdatol* dato);
    
    /*************************Insertar_Lista***************************/
	//Primitiva de TDA: Insertar elemento en la posición señalada por el 
	//iterador
	//Pre: la lista y el iterador existen
	//Post: se agregó un nodo con el dato recibido 
    bool insertar_lista (tlista *lista, tlista_iter * iter, tdatol dato);
   
   	/**************************Borrar_Lista****************************/
	//Primitiva de TDA: Borrar elemento del nodo señalado por el iter
	//Pre: la lista y el iterador exiten, y este último no señala al 
	//final
	//Post: se eliminó el nodo de la lista, el dato contenido es
	//almacenado en elemento 
    bool borrar_lista (tlista *lista, tlista_iter *iter, tdatol * dato);
    
    /*******************Insertar_Lista_Primero*************************/
	//Primitiva de TDA: Insertar elemento en la  primera posición
	//Pre: la lista existe
	//Post: se agregó un nodo con el dato recibido 
    bool insertar_lista_primero (tlista *lista, tdatol dato);
    
    bool listar_primero (const tlista *lista, tdatol *dato);

#endif /*_LISTAS_H */
